home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / CALLS.D < prev    next >
Encoding:
Modula Definition  |  1990-10-21  |  5.2 KB  |  145 lines

  1. DEFINITION MODULE Calls;
  2.  
  3. (*
  4.  * Funktionen zum Verwenden eines eigenen, definierten Stacks
  5.  * sowie zum Aufrufen/Bereistellen von externen, Modula-fremden,
  6.  * Funktionen.
  7.  *
  8.  * Die ehemaligen Funktionen 'CallSystem' und 'CallExternal' sind
  9.  * nicht mehr vorhanden und müssen ggf. durch die entsprechenden
  10.  * Funktionen aus dem Modul SYSTEM ersetzt werden.
  11.  *)
  12.  
  13. FROM SYSTEM IMPORT LONGWORD, ADDRESS;
  14.  
  15. FROM MOSGlobals IMPORT MemArea;
  16.  
  17. FROM SysTypes IMPORT PtrAnyType, AnyType, AnyLongType;
  18.  
  19.  
  20. TYPE AddrProc = PROCEDURE ( ADDRESS );
  21.  
  22.  
  23. (*$H+  >> erlaubt lokale Prozeduren bei 'CallProc' *)
  24.  
  25. PROCEDURE CallProc (procedure: AddrProc; data: ADDRESS; REF workSpace: MemArea);
  26.   (*
  27.    * Ruft eine Modula-Funktion mit einem eigens dafür angelegten Stackbereich
  28.    * auf. Der Stackbereich muß mind. 512 Byte groß sein.
  29.    * Zusätzlich kann ihr in 'data' z.B. ein Pointer auf ein Datenfeld übergeben
  30.    * werden.
  31.    *
  32.    * Beispiel:
  33.    *
  34.    *   TYPE dataType = RECORD a,b,c: REAL END;
  35.    *
  36.    *   PROCEDURE p1 ( dat0: ADDRESS );
  37.    *     VAR a: ARRAY [1..5000] OF LONGCARD; (* belegt 20000 Bytes des Stacks *)
  38.    *         data: POINTER TO dataType;
  39.    *     BEGIN
  40.    *       data:= dat0;
  41.    *       ...
  42.    *       data^.c:= data^.a DIV data^.b;
  43.    *       ...
  44.    *     END p1;
  45.    *
  46.    *   VAR stck: MemArea; data1, data2: dataType;
  47.    *
  48.    *   BEGIN
  49.    *     stck.length := 25000;
  50.    *     ALLOCATE ( stck.bottom, stck.length ); (* Stack-Bereich reservieren *)
  51.    *     IF stck.bottom = NIL THEN HALT END; (* Programmstop, wenn kein Speicher *)
  52.    *     ...
  53.    *     data1.a:= 8.9; data1.b:= 1.144;
  54.    *     CallProc ( p1, ADR (data1), stck );
  55.    *     ...
  56.    *     data2.a:= 8.9; data2.b:= 1.144;
  57.    *     CallProc ( p1, ADR (data2), stck );
  58.    *     ...
  59.    *)
  60.  
  61. (*$H+  >> erlaubt lokale Prozeduren bei 'CallSupervisor' *)
  62.  
  63. PROCEDURE CallSupervisor (proc: AddrProc; data: ADDRESS; REF wsp: MemArea);
  64.   (*
  65.    * Wie 'CallProc', jedoch wird hier die Prozedur 'proc' im Supervisor-
  66.    * modus aufgerufen.
  67.    * 'wsp.length' muß mindestens 512 sein, da Platz für evtl. Interrupts
  68.    * vorhanden sein muß.
  69.    *)
  70.  
  71. (*$H-*)
  72.  
  73. TYPE    Registers = RECORD
  74.           regD0, regD1, regD2, regD3, regD4, regD5, regD6, regD7: AnyLongType;
  75.           regA0, regA1, regA2, regA3, regA4, regA5, regA6       : AnyLongType;
  76.           parm: PtrAnyType;  (* Pointer auf evtl. Daten (SP) *)
  77.         END;
  78.  
  79. TYPE    RegsProc = PROCEDURE ( VAR Registers );
  80.  
  81.  
  82. PROCEDURE NewCaller (     m2Proc       : RegsProc;
  83.                           enterUserMode: BOOLEAN;
  84.                           wsp          : MemArea;
  85.                       VAR entry        : ADDRESS );
  86.   (*
  87.    * Generiert eine Routine, die von externen Funktionen bei 'entry' per
  88.    * 'JSR'-Anweisung angesprungen werden kann (nicht geeignet für Exceptions).
  89.    * Sie erzeugt eine Modula-gerechte Umgebung mit Hilfe des Stackbereichs
  90.    * 'wsp', von der dann die Modula-Funktion 'm2Proc' aufgerufen wird.
  91.    *
  92.    * 'm2Proc' bekommt dabei alle Informationen über Register und Parameter
  93.    * übergeben. 'parm' enthält den Stack-Pointer, der evtl. auf darauf
  94.    * geladene Parameter zeigt.
  95.    * Wenn 'm2Proc' endet, wird zur aufrufenden Funktion zurückgekehrt.
  96.    *
  97.    * 'enterUserMode' muß FALSE sein, wenn der Aufruf aus dem Usermode erfolgt.
  98.    * Erfolgt der Aufruf im Supervisormode (z.B, wenn die Routine auf einen
  99.    * System- oder Exceptionvektor installiert wird), bestimmt 'enterUserMode',
  100.    * ob die Modula-Funktion auch im Supervisormode (FALSE) oder im Usermode
  101.    * (TRUE) ausgeführt werden soll.
  102.    * In jedem Fall zeigt 'Registers.parm' auf die Stackdaten des Aufrufers.
  103.    *
  104.    * 'Registers.parm' darf willkürlich verändert werden, der Wert wird beim
  105.    * Rücksprung nicht benötigt. Alle übrigen Werte des RECORDs werden dagegen
  106.    * beim Rücksprung zurückgeladen.
  107.    *
  108.    * Der Stack (wsp.length) sollte mindestens 800 Byte groß sein.
  109.    *
  110.    * Es muß beachtet werden, daß bei Beendigung des Programms, das
  111.    * 'NewCaller' aufrief, 'entry' nicht mehr angesprungen werden darf.
  112.    *
  113.    * Wenn nach dem Aufruf 'entry' = NIL ist, konnte die Routine nicht
  114.    * generiert werden, da der vorhandene Speicherplatz nicht ausreichte.
  115.    *
  116.    * Die Hilfsroutine wird im angegebenen Stack-Bereich erzeugt, somit
  117.    * wird kein verzögernder ALLOCATE-Aufruf mehr getätigt, wie in früheren
  118.    * Versionen.
  119.    *)
  120.  
  121. PROCEDURE DisposeCaller ( VAR entry: ADDRESS );
  122.   (*
  123.    * Ist nun überflüssig. Diese Funktion ist nur zur Kompatibilitäts-
  124.    * wahrung noch vorhanden.
  125.    *)
  126.  
  127. PROCEDURE SysNewCaller ( m2Proc: RegsProc; enterUserMode: BOOLEAN; wsp: MemArea; VAR entry: ADDRESS );
  128.   (*
  129.    * Ist nun überflüssig. Diese Funktion ist nur zur Kompatibilitäts-
  130.    * wahrung noch vorhanden.
  131.    *)
  132.  
  133. PROCEDURE CallExtRegs ( procAddr: ADDRESS; VAR regs: Registers );
  134.   (*
  135.    * Ruft eine Funktion an der Adresse 'procAddr' per JSR-Instruktion auf.
  136.    * Alle Register können frei gewählt werden, nach dem Aufruf enthält
  137.    * 'regs' wiederum die von der Routine gelieferten Registerwerte.
  138.    * Es ist nicht möglich, Daten über den Stack zu übergeben.
  139.    * Auch 'regs.parm' wird nicht benutzt!
  140.    * Diese Funktion rettet sicherheitshalber selbst die Register D3-D7
  141.    * und A3-A6.
  142.    *)
  143.  
  144. END Calls.
  145.